package com.insta.poly;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Sebastien
 */
public class Program
{
    
    public static void Test_Poly_1()
    {
        // Une variable peut avoir 2 types :
        //      - son type de déclaration
        //      - le type réellement instancié.
        
        //[Type de déclaration]             // Type instancié
          //Car c                       = new Car();
          
          /* Dans ce cas précis, le type de déclaration est 
           * le même que le type instancié, donc :
           *    - pas de polymorphisme
           *    - L'implémentation appelée de "getMaxSpeed" sera
           *      celle définie dans la classe Car (dans la classe
           *      qui est le type instancié).
           */
          //System.out.println(c.getMaxSpeed());
    }
    
    public static void Test_Poly_2()
    {
        // Type de déclaration  : Car
        // Type instancié       : Jaguar
        Car j = new Jaguar();
        
        // Ici ce sera l'implémentation de "Jaguar.getMaxSpeed"
        // qui sera appelée (c'est toujours sur le type instancié
        // que la méthode est appelée).
        
        // C'EST LE POLYMORPHISME !!
        // La variable "a la forme" d'un "Car", mais va
        // se comporter comme une "Jaguar"
        System.out.println(j.getMaxSpeed());  //--> 270
    }
    
    
    public static void Test_Poly_Listes()
    {
        // On déclare un tableau dont chacune des cases
        // a pour type de déclaration "Car".
        Car[] allCars = new Car[3];
        
        // On instancie trois objets héritant de Car
        Jaguar x = new Jaguar();
        AudiR8 y = new AudiR8();
        Clio   z = new Clio();
        
        // et l'on stocke ces éléments dans le tableau..
        allCars[0] = x;
        allCars[1] = y;
        allCars[2] = z;
        
        Jaguar myJag;
        
        // Maintenant, on parcourt le tableau en appelant sur 
        // chacun des membres de ce tableau, la méthode "getMaxSpeed",
        // définie dans "Car" mais redéfinie dans les trois sous-classes.
        for( Car theCar : allCars)
        {
            // Si c'est une Jaguar..
            if (theCar instanceof Jaguar)
            {
                // On recaste l'objet en Jaguar..
                myJag  = (Jaguar)theCar;
                
                // et l'on fait un appel d'une méthode
                // spécifiqueà une Jaguar..
                myJag.engageTurbo();
            }
            
            System.out.println(theCar.getClass().getName() + " : " + theCar.getMaxSpeed());
        }       
    }
    
    
    
    
    
    
    
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        Test_Poly_Listes();
    }
    
}
